﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//using System.Windows.Media.Imaging;
//using System.Runtime.InteropServices;
//using System.Windows.Media;
//using System.Drawing;
//using System.Windows;
//using System.Threading;

//namespace App2Wpf
//{
//    class testCase
//    {
//        private void ReadEvf()
//        {
//            // 等待实时图像传输开启
//            SpinWait.SpinUntil(() => (EvfOutputDevice & EDSDK.EvfOutputDevice_PC) != 0, 5000);

//            IntPtr stream = IntPtr.Zero;
//            IntPtr evfImage = IntPtr.Zero;
//            IntPtr evfStream = IntPtr.Zero;
//            UInt64 length = 0, maxLength = 2 * 1024 * 1024;

//            var err = EDSDK.EDS_ERR_OK;

//            // 当实时图像传输开启时，不断地循环
//            while (isSessionOpened && (EvfOutputDevice & EDSDK.EvfOutputDevice_PC) != 0)
//            {
//                lock (sdkLock)
//                {
//                    err = EDSDK.EdsCreateMemoryStream(maxLength, out stream); // 创建用于保存图像的流对象

//                    if (err == EDSDK.EDS_ERR_OK)
//                    {
//                        err = EDSDK.EdsCreateEvfImageRef(stream, out evfImage); // 创建evf图像对象

//                        if (err == EDSDK.EDS_ERR_OK)
//                            err = EDSDK.EdsDownloadEvfImage(camera, evfImage); // 从相机下载evf图像

//                        if (err == EDSDK.EDS_ERR_OK)
//                            err = EDSDK.EdsGetPointer(stream, out evfStream); // 获取流对象的流地址

//                        if (err == EDSDK.EDS_ERR_OK)
//                            err = EDSDK.EdsGetLength(stream, out length); // 获取流的长度
//                    }
//                }

//                if (err == EDSDK.EDS_ERR_OK)
//                    RenderBitmap(evfStream, length); // 渲染图像

//                if (stream != IntPtr.Zero)
//                {
//                    EDSDK.EdsRelease(stream);
//                    stream = IntPtr.Zero;
//                }

//                if (evfImage != IntPtr.Zero)
//                {
//                    EDSDK.EdsRelease(evfImage);
//                    evfImage = IntPtr.Zero;
//                }

//                if (evfStream != IntPtr.Zero)
//                {
//                    EDSDK.EdsRelease(evfStream);
//                    evfStream = IntPtr.Zero;
//                }
//            }

//            // 停止显示图像
//            context.Send(n => { WriteableBitmap = null; }, null);
//        }




//        private WriteableBitmap writeableBitmap;
//        /// <summary>
//        /// WPF的一个高性能渲染图像，利用后台缓冲区，渲染图像时不必每次都切换线程
//        /// </summary>
//        private WriteableBitmap WriteableBitmap
//        {
//            get => this.writeableBitmap;
//            set
//            {
//                if (this.writeableBitmap == value)
//                    return;

//                if (this.writeableBitmap == null)
//                    CompositionTarget.Rendering += OnRender;
//                else if (value == null)
//                    CompositionTarget.Rendering -= OnRender;

//                this.writeableBitmap = value;
//                this.ImageSourceChanged?.Invoke(value);
//            }
//        }

//        private void RenderBitmap(IntPtr evfStream, UInt64 length)
//        {
//            var data = new Byte[length];
//            var bmpStartPoint = new System.Drawing.Point(0, 0);

//            Marshal.Copy(evfStream, data, 0, (Int32)length); // 从流地址拷贝一份到字节数组，再解码获取图像（如果可以写一个从指针解码图像，可以优化此步骤）

//            using (var bmp = (Bitmap)imageConverter.ConvertFrom(data)) // 解码获取Bitmap
//            {
//                if (this.WriteableBitmap == null || this.width != bmp.Width || this.height != bmp.Height)
//                {
//                    // 第一次或宽高不对应时创建WriteableBitmap对象
//                    this.width = bmp.Width;
//                    this.height = bmp.Height;

//                    // 通过线程同步上下文切换到主线程
//                    context.Send(n => {
//                        WriteableBitmap = new WriteableBitmap(this.width, this.height, 96, 96, PixelFormats.Bgr24, null);
//                        backBuffer = WriteableBitmap.BackBuffer; // 保存后台缓冲区指针
//                        this.stride = WriteableBitmap.BackBufferStride; // 单行像素数据中的字节数
//                        this.length = this.stride * this.height; // 像素数据的总字节数
//                    }, null);
//                }

//                // 获取Bitmap的像素数据指针
//                var bmpData = bmp.LockBits(new Rectangle(bmpStartPoint, bmp.Size), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

//                // 将Bitmap的像素数据拷贝到WriteableBitmap
//                if (this.stride == bmpData.Stride)
//                    Memcpy(backBuffer, bmpData.Scan0, this.length);
//                else
//                {
//                    var s = Math.Min(this.stride, bmpData.Stride);
//                    var tPtr = backBuffer;
//                    var sPtr = bmpData.Scan0;
//                    for (var i = 0; i < this.height; i++)
//                    {
//                        Memcpy(tPtr, sPtr, s);
//                        tPtr += this.stride;
//                        sPtr += bmpData.Stride;
//                    }
//                }

//                bmp.UnlockBits(bmpData);
//                Interlocked.Exchange(ref newFrame, 1);
//            }
//        }

//        private void OnRender(Object sender, EventArgs e)
//        {
//            var curRenderingTime = ((RenderingEventArgs)e).RenderingTime;

//            if (curRenderingTime == lastRenderingTime)
//                return;

//            lastRenderingTime = curRenderingTime;

//            if (Interlocked.CompareExchange(ref newFrame, 0, 1) != 1)
//                return;

//            var bmp = this.WriteableBitmap;
//            bmp.Lock();
//            bmp.AddDirtyRect(new Int32Rect(0, 0, bmp.PixelWidth, bmp.PixelHeight));
//            bmp.Unlock();
//        }
//    }
//}
